"use strict"
import axios from "axios";
import settle from "axios/lib/core/settle";
import buildURL from "axios/lib/helpers/buildURL";
import qs from "qs";
import globalData from "@/config"; // 基础信息
import httpErrorHandler from "./httpErrorHandler";
// #ifdef H5
import {browser} from "@/utils/index.js";
// #endif

const config = {
	baseURL: globalData.http_host, //请求域名
	timeout: 60 * 1000, // Timeout,
	headers: {
		"Content-Type": "multipart/form-data",
	},
	withCredentials: true, // Check cross-site Access-Control
	crossDomain: true,
	async: false
}

const upLoadFile = axios.create(config)


/**
 * @Author: liuxu
 * @description: axios 初始化请求参数
 * @param {Object} config
 * @return {*}
 */
const requestData = function(config) {
	let requestData = {}
	try {
		requestData.user_id = (config && config.user_id) || globalData.user_id;
		// #ifdef MP-WEIXIN
		requestData.mini_user_token = globalData.mini_user_token;
		// #endif
	} catch (e) {
		// console.log("index.js请求参数:", e)
	}
	if (!globalData.isDev) {
		// #ifdef H5
		requestData = {}
		// #endif
	}

	return {
		...config.data,
		...requestData
	}
}


// request拦截器,在请求之前做一些处理
upLoadFile.interceptors.request.use(
	(config) => {
		//请求Loading
		config.loading !== false && uni.showLoading({
			title: `上传中`,
			mask: true
		});

		// 请求参数
		config.data = requestData(config);

		// 调试打印
		console.info("request拦截器之前:", config)
		return config
	},
	(error) => {
		// 调试打印
		console.log("request拦截器之前:", error)
		return Promise.reject(error)
	}
)

//配置成功后的拦截器
upLoadFile.interceptors.response.use((response) => {
	//请求Loading
	response.config.loading !== false && uni.hideLoading()
	console.log("request请求执行完成：", response)

	let data = {
		errcode: 500,
		errmsg: '未知错误',
		data: ""
	}
	try {
		//请求状态成功
		if (response.status == 200 && response.data.errcode == 0) {
			return response.data
		} else if (response.data.errcode) {
			return Promise.reject(response.data)
		} else {
			return Promise.reject(data)
		}
	} catch (e) {
		//TODO handle the exception
		console.log("request请求执行完成后:", e)
		if (response.errMsg && response.errMsg.includes('timeout')) { // 判断请求异常信息中是否含有超时timeout字符串
			data.errmsg = "网络连接超时"
			data.errcode = 408;
		}
		return Promise.reject(data)
	}
}, httpErrorHandler)

upLoadFile.defaults.adapter = function(config) {
	//自己定义个适配器，用来适配uniapp的语法
	return new Promise((resolve, reject) => {
		let uploadTask = uni.uploadFile({
			url: config.baseURL + buildURL(config.url), //接口地址
			files: config.files, // 需要上传的文件列表。使用 files 时，filePath 和 name 不生效。
			fileType: config.fileType || "image", //文件类型，image/video/audio
			file: config.file, //要上传的文件对象。
			filePath: config.filePath, //要上传文件资源的路径。
			name: config.name || "file", //文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容
			header: config.header, //HTTP 请求 Header, header 中不能设置 Referer。
			timeout: config.timeout, //超时时间，单位 ms
			formData: config.data && JSON.parse(config.data),
			complete: function complete(response) {
				response = {
					data: response.data,
					status: response.statusCode,
					errMsg: response.errMsg,
					header: response.header,
					config: config,
				}
				settle(resolve, reject, response)
			},
		})
		config.onUploadProgress !== false && uploadTask
			.onProgressUpdate(res => {
				if (res.progress != 100) {
					uni.showLoading({
						title: `上传${res.progress}%`,
						mask: true
					});
				} else {
					uni.showLoading({
						title: `保存中...`,
						mask: true
					});
				}
			})
	})
}

export default upLoadFile
